// src/utils/request.js
import axios from 'axios';
import {ADMIN_USER_TOKEN, BASE_URL, USER_TOKEN} from "@/store/constants";

// 创建一个 axios 实例
const service = axios.create({
    baseURL: BASE_URL+'/api', // 你的 API 基础路径，可以在 .env 文件中配置
    timeout: 15000, // 请求超时时间
    withCredentials: true, // 允许发送 cookie
});

// 请求拦截器
service.interceptors.request.use(
    config => {
        config.headers['Content-Type'] = 'application/json;charset=utf-8';
        config.headers.ADMINTOKEN = localStorage.getItem(ADMIN_USER_TOKEN)
        config.headers.TOKEN = localStorage.getItem(USER_TOKEN)
        return config;
    },
    error => {
        // 对请求错误做些什么
        console.error(error);
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    response => {
        // 如果自定义代码不是 200，则判断为错误。
        if(response.status === 200) {
            if(response.data.code === 0 || response.data.code === 200) {
                if (response.config.method !== 'delete') {
                    setInfo(response)
                }
                // if (response.data.timestamp) {
                //
                //     const timestampToDate = (timestamp) => {
                //         const date = new Date(timestamp);
                //         return date.toLocaleString(); // 或者使用Intl.DateTimeFormat进行自定义格式化
                //     };
                //     response.data.timestamp = timestampToDate(response.data.timestamp);
                // }
                return response
            } else {
                return Promise.reject(response.data)
            }
        } else {
            return Promise.reject(response.data)
        }
    },

    error => {
        console.log(error.response.status)
        if(error.response.status === 404) {
            // todo
        } else if(error.response.status === 403) {
            // todo
        }
        return Promise.reject(error)
    }
);

const setInfo = (response) => {
    if (response.data.data != null && response.data.data.list != null) {
        for (let i = 0; i < response.data.data.list.length; i++) {

            // 将时间戳字段转换为可读日期时间
            if (response.data.data.list[i].createTime) {
                const createTime = Number(response.data.data.list[i].createTime);
                if (!isNaN(createTime)) {
                    const date = new Date(createTime);
                    if (!isNaN(date.getTime())) {
                        response.data.data.list[i].createTime = date.toLocaleString();
                    } else {
                        console.warn('Invalid timestamp:', createTime);
                    }
                } else {
                    console.warn('Invalid timestamp format:', response.data.data.list[i].createTime);
                }
            }
            //将状态字段转换为汉字
            switch (response.data.data.list[i].status) {
                case "0":
                    response.data.data.list[i].status = '正常';
                    break;
                case "1":
                    response.data.data.list[i].status = '封号';
                    break;
                default:
                    response.data.data.list[i].status = '未知';
                    break;
            }
            //将role字段转换为汉字 LOGIN:普通用户 DEMO：演示账号 ADMIN:管理员 SUPER：超级管理员
            switch (response.data.data.list[i].role) {
                case 'LOGIN':
                    response.data.data.list[i].role = '普通用户';
                    break;
                case 'DEMO':
                    response.data.data.list[i].role = '演示账号';
                    break;
                case 'ADMIN':
                    response.data.data.list[i].role = '管理员';
                    break;
                case 'SUPER':
                    response.data.data.list[i].role = '超级管理员';
                    break;
                default:
                    response.data.data.list[i].role = '未知';
                    break;
            }
        }

    }
}
/**
 * 发起网络请求的封装函数。
 *
 * 该函数通过接收一个配置对象，返回一个Promise对象，用于处理异步的网络请求和响应。
 * 主要负责调用实际的请求服务函数，并根据请求结果决定是解析成功数据还是传递错误信息。
 *
 * @param {Object} config 请求的配置对象，包含各种请求参数。
 * @returns {Promise} 返回一个Promise对象，用于处理请求的成功或失败。
 */
const request = (config) => {
    const conf = config;
    return new Promise((resolve, reject) => {
        service.request(conf).then((res) => {
            const data = res.data;
            resolve(data);
        }).catch(err => {
            reject(err);
        });
    });
};

/**
 * 封装GET请求的函数。
 *
 * 该函数通过调用request函数，为GET请求提供方便的调用方式。
 * 它接受一个配置对象，并在该对象的基础上添加method属性为'GET'，然后调用request函数发起请求。
 *
 * @param {Object} config 请求的配置对象，包含各种请求参数。
 * @returns {Promise} 返回一个Promise对象，用于处理GET请求的成功或失败。
 */
export function get(config) {
    return request({ ...config, method: 'GET' });
}

/**
 * 封装POST请求的函数。
 *
 * 该函数通过调用request函数，为POST请求提供方便的调用方式。
 * 它接受一个配置对象，并在该对象的基础上添加method属性为'POST'，然后调用request函数发起请求。
 *
 * @param {Object} config 请求的配置对象，包含各种请求参数。
 * @returns {Promise} 返回一个Promise对象，用于处理POST请求的成功或失败。
 */
export function post(config) {
    return request({ ...config, method: 'POST' });
}

export default service;


